package com.muse.sentinel.demo1;

import java.util.ArrayList;
import java.util.List;

import com.alibaba.csp.sentinel.slots.block.RuleConstant;
import com.alibaba.csp.sentinel.slots.block.degrade.DegradeRule;
import com.alibaba.csp.sentinel.slots.block.degrade.DegradeRuleManager;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;

/**
 * @description 配置限流规则和熔断规则
 * @author: muse
 * @create: 2021-08-19 11:23
 **/
public class RulesUtils {
    public static final int MAX_NUM = 5000;
    public static final int MIN_NUM = 20;
    public static final String FLOW_RULES_RESOURCES = "process";
    public static final String DEGRADERULES_RULES_RESOURCES = "processError";

    /**
     * 配置限流策略
     */
    public static void initFlowRules() {
        List<FlowRule> rules = new ArrayList<>();
        FlowRule rule = new FlowRule();
        /**
         * 限流阈值类型：
         * * 并发线程数模式——RuleConstant.FLOW_GRADE_THREAD 0
         * * QPS模式——RuleConstant.FLOW_GRADE_QPS 1
         */
        rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
        /**
         * 调用关系限流策略：
         * * 直接——RuleConstant.STRATEGY_DIRECT 0 (默认)
         * * 关联——RuleConstant.STRATEGY_RELATE 1
         * * 链路——RuleConstant.STRATEGY_CHAIN  2
         */
        rule.setStrategy(RuleConstant.STRATEGY_DIRECT);
        /**
         * QPS流量流控行为：
         * * 直接拒绝——CONTROL_BEHAVIOR_DEFAULT 0 (默认)
         * * 慢启动模式——CONTROL_BEHAVIOR_WARM_UP 1
         * * 匀速排队——CONTROL_BEHAVIOR_RATE_LIMITER 2
         * * 冷启动+匀速排队——CONTROL_BEHAVIOR_WARM_UP_RATE_LIMITER 3
         */
        rule.setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_DEFAULT);

        rule.setResource(FLOW_RULES_RESOURCES); // 设置需要保护的资源。这个资源的名称必须和SphU.entry中使用的名称保持一致。
        rule.setCount(20); // 限流阈值
        rule.setLimitApp("default"); // 是否需要针对调用来源进行限流，默认是default，即：不区分调用来源
        rule.setClusterMode(false); // 是否是集群限流，默认为否
        rules.add(rule);
        FlowRuleManager.loadRules(rules);
    }

    /**
     * 配置熔断策略
     */
    public static void initDegradeRule() {
        List<DegradeRule> rules = new ArrayList<>();
        DegradeRule rule = new DegradeRule();
        /**
         * 熔断策略，支持秒级RT、秒级异常比例、分钟及异常数。默认是秒级RT。
         * * 平均响应时间——RuleConstant.DEGRADE_GRADE_RT 0
         * * 异常比例——RuleConstant.DEGRADE_GRADE_EXCEPTION_RATIO 1
         * * 异常数——RuleConstant.DEGRADE_GRADE_EXCEPTION_COUNT 2
         */
        rule.setGrade(RuleConstant.DEGRADE_GRADE_EXCEPTION_COUNT);

        rule.setResource(DEGRADERULES_RULES_RESOURCES); // 设置需要保护的资源。这个资源的名称必须和SphU.entry中使用的名称保持一致。
        rule.setCount(5); // 限流阈值
        rule.setTimeWindow(10); // 发生降级时降级恢复超时（以秒为单位）。
        rules.add(rule);
        DegradeRuleManager.loadRules(rules);
    }

}
